package com.ylr.admin.framework.service;

import com.ylr.base.common.dto.PageDto;
import com.ylr.admin.common.dto.dept.DeptDto;
import com.ylr.admin.common.dto.dept.DeptEnumDto;
import com.ylr.base.common.vo.UpdateStatusVo;
import com.ylr.admin.common.vo.dept.DeptFormVo;
import com.ylr.admin.common.vo.dept.DeptVo;
import com.ylr.admin.framework.entity.DeptEntity;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wyw
 * date: 2023-04-21 11:27:23
 * className: DeptService
 * version: 1.0
 * description:
 */
public interface DeptService extends IService<DeptEntity> {

    /**
     * 保存部门操作
     * @param deptVo 参数对象
     */
    void saveDept(DeptVo deptVo);

    /**
     * 分页查询部门列表操作
     * @param deptFormVo 参数对象
     * @return 部门分页数据
     */
    PageDto<DeptDto> pageDeptList(DeptFormVo deptFormVo);

    /**
     * 获取部门数据操作
     * @param id 主键
     * @return 部门数据
     */
    DeptDto getDept(Long id);

    /**
     * 获取子部门下一个排序等级操作
     * 根据父级主键，获取其子部门的下一个排序等级
     * @param parentId 父级主键
     * @return 排序等级数值
     */
    Integer getNextSort(Long parentId);

    /**
     * 获取部门结构树操作
     * 所有有效部门组成的结构树数据
     * @return 部门结构树数据
     */
    DeptDto getDeptTree();

    /**
     * 获取父级部门操作
     * 根据部门主键，获取其所有父级及其父父级部门
     * @param id    部门主键
     * @param order 排序方式[0-顶级父级到直接父级 1-直接父级到顶级父级]
     * @return 父级部门列表
     */
    List<DeptDto> getParentDeptList(Long id, Integer order);

    /**
     * 获取部门结构树操作
     * 如果传递父级主键，则获取其子部门结构树
     * @param parentId 父级主键
     * @return 部门结构树数据
     */
    List<DeptDto> getChildrenDeptTree(Long parentId);

    /**
     * 获取部门页面枚举数据操作
     * @return 页面枚举数据
     */
    DeptEnumDto getPageEnums();

    /**
     * 获取部门名称
     * 查询部门主键对应的部门名称，并组成映射关系
     * @param deptIdSet 部门主键集合
     * @return 部门名称集合
     */
    Map<String, String> getDeptNameMap(Set<Long> deptIdSet);

    /**
     * 修改部门操作
     * @param deptVo 参数对象
     */
    void updateDept(DeptVo deptVo);

    /**
     * 修改部门状态操作
     * @param updateStatusVo 参数对象
     */
    void updateDeptStatus(UpdateStatusVo updateStatusVo);

    /**
     * 删除部门接口
     * @param idList 主键列表
     */
    void deleteDept(List<Long> idList);


}

